package net.zio.kamenriderzioaddon.ridersystem.util;

import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3;
import java.util.List;

public class SpecialEffectsUtils {

    /**
     * 在指定位置创建球形推力效果
     *
     * @param level 服务器世界
     * @param center 中心位置
     * @param radius 球形半径
     * @param strength 推力强度
     */
    public static void createSphericalPushEffect(ServerLevel level, Vec3 center, double radius, double strength, Entity centerEntity) {
        System.out.println("创建球形推力效果 - 中心: " + center + ", 半径: " + radius + ", 强度: " + strength);
        // 计算球形区域的边界框
        AABB area = new AABB(
                center.x - radius, center.y - radius, center.z - radius,
                center.x + radius, center.y + radius, center.z + radius
        );
        System.out.println("检测区域: " + area);

        // 获取区域内的所有实体
        List<Entity> entities = level.getEntities(null, area);
        System.out.println("找到 " + entities.size() + " 个实体");

        for (Entity entity : entities) {
            // 忽略中心实体（玩家自己）
            if (entity == centerEntity) {
                System.out.println("跳过玩家自身");
                continue;
            }

            // 计算从中心到实体的向量
            Vec3 toEntity = entity.position().subtract(center);
            double distance = toEntity.length();
            System.out.println("距离: " + distance);

            // 如果实体在球体内
            if (distance < radius) {
                // 标准化向量并反向（从中心向外推）
                Vec3 direction = toEntity.normalize().reverse();

                // 根据距离调整推力（越近推力越大）
                double distanceFactor = 1.0 - (distance / radius);
                Vec3 push = direction.scale(strength * distanceFactor);

                // 应用推力
                entity.setDeltaMovement(entity.getDeltaMovement().add(push));
                System.out.println("应用推力: " + push);

                // 如果是生物实体，标记为受伤以更新运动
                if (entity instanceof LivingEntity) {
                    ((LivingEntity) entity).hurtMarked = true;
                }
            }
        }
    }

    /**
     * 在玩家位置创建球形推力效果
     *
     * @param player 玩家
     * @param radius 球形半径
     * @param strength 推力强度
     */
    public static void createPlayerSphericalPush(Player player, double radius, double strength) {
        if (player.level instanceof ServerLevel serverLevel) {
            createSphericalPushEffect(serverLevel, player.position(), radius, strength, player);
        }
    }
}